package com.loong.web.suppert.intercept.auth;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import com.loong.web.suppert.auth.User;
import com.loong.web.suppert.auth.UserSessions;

/**
 * 权限控制器
 * 
 * @author 张成轩
 */
public class AuthController {

	/** 无权限访问处理器 */
	private UnAuthHandler unAuthHandler;

	/**
	 * @param request 请求
	 * @param response 响应
	 * @param handler 处理方法
	 * @return 是否有权限
	 * @throws IOException io异常
	 */
	public boolean control(HttpServletRequest request, HttpServletResponse response, HandlerMethod handler)
			throws IOException {

		// 权限控制
		AuthType auth = handler.getMethodAnnotation(AuthType.class);
		if (auth != null) {
			// 用户对象
			User user = UserSessions.getUser(request);
			// 用户是否有权限
			boolean hasAuth;
			// 是否需要权限
			if (auth.value().length == 0)
				// 不需要权限
				hasAuth = true;
			else if (user == null)
				// 没有登录
				hasAuth = false;
			else {
				hasAuth = false;
				// 遍历查看用户是否有权限访问
				for (String a : auth.value())
					if (user.has(a)) {
						hasAuth = true;
						break;
					}
			}
			if (!hasAuth && unAuthHandler != null) {
				// 没有权限的处理
				ResponseBody body = handler.getMethodAnnotation(ResponseBody.class);
				if (body == null)
					// mapping处理
					unAuthHandler.mapping(request, response, user != null);
				else
					unAuthHandler.api(request, response, user != null);
			}
			return hasAuth;
		}
		return true;
	}

	/**
	 * @param unAuthHandler 无权限访问处理器
	 */
	public void setUnAuthHandler(UnAuthHandler unAuthHandler) {

		this.unAuthHandler = unAuthHandler;
	}
}
